package com.cw.DesignModel23.Ceational.PrototypePattern.cloneFramework;

public class Main {
    public static void main(String[] args) {
        // 准备
        Manager manager = new Manager();
        UnderlinePen upen = new UnderlinePen('~');
        MessageBox mbox = new MessageBox('*');
        MessageBox sbox = new MessageBox('/');
        manager.register("strong message", upen);
        manager.register("warning box", mbox);
        manager.register("slash box", sbox);

        // 生成
        Product p1 = manager.create("strong message");
        p1.use("Hello, world.");
        System.out.println();
        Product p2 = manager.create("warning box");
        p2.use("Hello, world.");
        System.out.println();
        Product p3 = manager.create("slash box");
        p3.use("Hello, world.");
    }
}
//        "Hello, world."
//        ~~~~~~~~~~~~~
//
//        *****************
//        * Hello, world. *
//        *****************
//
//        /
//        / Hello, world. /
//        /
//
//        Process finished with exit code 0



/**
 分析
 对象种类繁多，无法将它们整合到一个类中时
 在示例程序中，一共出现了如下3种样式。

 使用’~'为字符串添加下划线
 使用’*'为字符串添加边框
 使用’/'为字符串添加边框
 本例比较简单，只生成了3种样式，不过无论多少种样式都可以生成。但是如果将每种样式都编写为一个类，类的数量将会非常庞大，源代码的管理也会变得非常困难。

 想解耦框架与生成的实例时
 在示例程序中，我们将复制(clone)实例的部分封装在framework包中了

 在Manager类的create方法中，我们并没有使用类名，而是根据"strong message"和"slash box"等字符串（即实例名称）来生成相应的实例。与Java语言自带的生成实例的newSomething()方式相比，这种方式具有更好的通用性，且将框架从类名的束缚中解脱出来了
 ————————————————
 版权声明：本文为CSDN博主「Hello Dam」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 原文链接：https://blog.csdn.net/laodanqiu/article/details/131853772
 */